<?php

class CalendarioController extends Zend_Controller_Action{

    public function init(){
        $this->em = Zend_Registry::getInstance()->entitymanager;
    }

    public function indexAction(){

        $detalles = $this->em->createQueryBuilder()
                             ->select    ('d.idCalendario')
                             ->addSelect ('d.descripcion')
                             ->addSelect ('d.fechaInicio')
                             ->addSelect ('d.fechaFin')
                             ->addSelect ('d.horaInicio')
                             ->addSelect ('d.horaFin')
                             ->addSelect ('d.tipo')
                             ->addSelect ('d.carrera')
                             ->addSelect ('d.semestres')
                             ->from      ('Default_Model_Calendario', 'd')
                             ->orderBy   ('d.fechaInicio', 'asc')
                             ->getQuery  ()
                             ->execute   ();

             foreach ($detalles as &$d) {
                 $d['fechaInicio'] = $d['fechaInicio']->format('Y-m-d');
                 $d['fechaFin'] = $d['fechaFin']->format('Y-m-d');
                 $d['horaInicio'] = $d['horaInicio']->format('H:i');
                 $d['horaFin'] = $d['horaFin']->format('H:i');
             }

        $carreras = $this->em->createQueryBuilder()
                             ->select    ('c.idCarrera')
                             ->addselect ('c.nombre')
                             ->from      ('Default_Model_Carrera', 'c')
                             ->orderBy   ('c.nombre', 'asc')
                             ->getQuery  ()
                             ->execute   ();

        //Agregar al array un elemento para la opcion Todas las carreras
        $add = array('idCarrera'=>0, 'nombre'=>'Todas');
        array_unshift($carreras, $add);

        $this->view->carreras = Zend_Json::encode(Array(
            "success" => true,
            "total"   => count($carreras),
            "rows"    => $carreras
        ));

        $this->view->detalles = Zend_Json::encode(Array(
            "success" => true,
            "total"   => count($detalles),
            "rows"    => $detalles
        ));

    }

    public function ajaxCargarAction(){
        $anho = $this->_request->getPost('anho');
        $detalles = $this->_request->getPost('detalles');
        $detalles = Zend_Json::decode($detalles);

        $desde = "01-01-".$anho;
        $hasta = "31-12-".$anho;

        $qb = $this->em->createQueryBuilder();

        //Se verifica que no exista un calendario en el año al cual se desea importar
        $cantidad = $qb->select    ('count(d.idCalendario)')
                       ->from      ('Default_Model_Calendario', 'd')
                       ->where     ($qb->expr()->between('d.fechaInicio', "'".$desde."'", "'".$hasta."'"))
                       ->getQuery  ()
                       ->getSingleScalarResult();

        if ($cantidad > 0){
            X\Msg::Failure('Ya existe un calendario para el año '.$anho.'.');
            return;
        } else{

            foreach ($detalles as $d) {

                $detalle = new Default_Model_Calendario();

                $detalle->setFechaInicio ($d['fechaInicio']);
                $detalle->setFechaFin    ($d['fechaFin']);
                $detalle->setHoraInicio  ($d['horaInicio']);
                $detalle->setHoraFin     ($d['horaFin']);
                $detalle->setCarrera     ($d['carrera']);
                $detalle->setDescripcion ($d['descripcion']);
                $detalle->setSemestres   ($d['semestres']);
                $detalle->setTipo        ($d['tipo']);

                $this->em->persist($detalle);

            }
            $this->em->flush();

            X\Msg::Success('El calendario ha sido cargado exitosamente.');

        }
        
    }

    public function ajaxImportarAction() {

        $anho = $this->_request->getPost('anho');
        $detalles = $this->_request->getPost('detalles');
        $detalles = Zend_Json::decode($detalles);

        /*var_dump($anho);
        echo "\n";
        var_dump($detalles);
        return;*/

        $desde = "01-01-".$anho;
        $hasta = "31-12-".$anho;

        $qb = $this->em->createQueryBuilder();

        //Se verifica que no exista un calendario en el año al cual se desea importar
        $cantidad = $qb->select    ('count(d.idCalendario)')
                       ->from      ('Default_Model_Calendario', 'd')
                       ->where     ($qb->expr()->between('d.fechaInicio', "'".$desde."'", "'".$hasta."'"))
                       ->getQuery  ()
                       ->getSingleScalarResult();

        if ($cantidad > 0){
            X\Msg::Failure('Ya existe un calendario para el año '.$anho.'. Por favor modifique el <b>Nuevo año</b>.');
            return;
        } else {
            //Se importa el calendario
            foreach($detalles as $d){
                
                //modificar fechas con el nuevo año
                list($year, $month, $date) = explode("-", $d['fechaInicio']);
                $nuevoInicio = $date."/".$month."/".$anho;
                list($year, $month, $date) = explode("-", $d['fechaFin']);
                $nuevoFin = $date."/".$month."/".$anho;
                
                //crear y asignar valores a nuevo objeto
                $evento = new Default_Model_Calendario();

                $evento->setFechaInicio ($nuevoInicio);
                $evento->setFechaFin    ($nuevoFin);
                $evento->setHoraInicio  ($d['horaInicio']);
                $evento->setHoraFin     ($d['horaFin']);
                $evento->setCarrera     ($d['carrera']);
                $evento->setDescripcion ($d['descripcion']);
                $evento->setSemestres   ($d['semestres']);
                $evento->setTipo        ($d['tipo']);

                $this->em->persist($evento);
            }
            $this->em->flush();

            X\Msg::Success('El calendario ha sido importado exitosamente.');
        }

    }

    public function ajaxEditarAction() {

        $anho     = $this->_request->getPost('anho');
        $detalles = $this->_request->getPost('detalles');

        $detalles = Zend_Json::decode($detalles);
        
        $desde = "01-01-".$anho;
        $hasta = "31-12-".$anho;

        $qb = $this->em->createQueryBuilder();

        //Se traen los detalles que originalmente tenia cargado el calendario
        $detallesActuales = $qb->select    ('d.idCalendario')
                               ->from      ('Default_Model_Calendario', 'd')
                               ->where     ($qb->expr()->between('d.fechaInicio', "'".$desde."'", "'".$hasta."'"))
                               ->orderBy   ('d.fechaInicio', 'asc')
                               ->getQuery  ()
                               ->execute   ();

        //Contendra todos los ids de detalles en el calendario, y si luego de modificarse
        //siguen en el calendario se marcaran con value true para indicar que no deben ser
        //borrados
        $modified = array();

        foreach ($detallesActuales as $da){
            $modified[$da['idCalendario']] = false;
        }

        foreach ($detalles as $d){
            $idActual = $d['idCalendario'];
            $modified[$idActual] = true;
            //Si es un detalle existente se modifica, si es nuevo se crea
            if($idActual){
                $evento = $this->em->find('Default_Model_Calendario', $idActual);
            } else {
                $evento = new Default_Model_Calendario();
            }
            $evento->setDescripcion($d['descripcion']);
            $fechaIni = substr($d['fechaInicio'],0,10);
            list($year, $month, $date) = explode("-", $fechaIni);
            $fechaIni = $date."/".$month."/".$year;
            $fechaFin = substr($d['fechaFin'],0,10);
            list($year, $month, $date) = explode("-", $fechaFin);
            $fechaFin = $date."/".$month."/".$year;
            $evento->setFechaInicio($fechaIni);
            $evento->setFechaFin($fechaFin);
            $evento->setHoraInicio($d['horaInicio']);
            $evento->setHoraFin($d['horaFin']);
            $evento->setCarrera($d['carrera']);
            $evento->setTipo($d['tipo']);
            $evento->setSemestres($d['semestres']);
            $this->em->persist($evento);
        }

        //Si un detalle fue removido, se elimina de la base de datos
        foreach($modified as $key => $value){
            if(!$value){
                $evento = $this->em->find('Default_Model_Calendario', $key);
                $this->em->remove($evento);
            }
        }

        $this->em->flush();

        X\Msg::Success('El calendario ha sido modificado exitosamente.');
    }

    public function ajaxEliminarAction() {
        // parametro
        //X\Permiso::paraAction('Eliminar.Calendario');
        //$codigoUsuario = $this->_request->getPost('idUsuario');

        $periodo = $this->_request->getPost('periodo');

        $inicio = $periodo."-01-01";
        $fin    = $periodo."-12-31";
        
        $qb = $this->em->createQueryBuilder();

        $eventos = $qb->select   ('c.idCalendario')
                      ->from     ('Default_Model_Calendario', 'c')
                      ->where    ($qb->expr()->between('c.fechaInicio', "'".$inicio."'", "'".$fin."'"))
                      ->getQuery ()
                      ->execute  ();

        foreach($eventos as $evento){
            $idEvento = $evento['idCalendario'];
            $e = $this->em->find('Default_Model_Calendario', $idEvento);
            $this->em->remove($e);
        }

        $this->em->flush();

        // json
        X\Msg::Success('El calendario ha sido eliminado exitosamente.');
    }


}

